package com.coolw.data.migrate.common.constant;

import lombok.AllArgsConstructor;
import lombok.Getter;

/**
 * SQL模板常量定义,占位符使用 hutool 提供的工具类 StrUtil.format()
 *
 * @author coolw
 * @date 2024/2/2 9:32
 */
public interface SqlTemplateConst {

    /**
     * 统计数量SQL模板，不带条件
     * 第一个{}:表名
     */
    String COUNT_SQL_TEMPLATE = "select count(*) from {}";

    @Getter
    @AllArgsConstructor
    enum BeforeDayEnum {
        /**
         * 统计数量SQL模板，带条件
         * 第1个{}:表名
         * 第2个{}:统计多少天之前的数据，不包含当天
         */
        COUNT_SQL_TEMPLATE_WITH_CONDITION("select count(*) from {} where DATE_FORMAT(date_created,'%Y-%m-%d') <= DATE_SUB(CURRENT_DATE,INTERVAL {} DAY)"),
        /**
         * 新增数据SQL模板
         * 第1个{}:目标表名
         * 第2个{}:源表名
         * 第3个{}:统计多少天之前的数据，不包含当天
         * 第4个{}:每批次迁移数量
         */
        INSERT_SQL_TEMPLATE("insert into {} select * from {} where DATE_FORMAT(date_created,'%Y-%m-%d') <= DATE_SUB(CURRENT_DATE,INTERVAL {} DAY) order by id asc limit {}"),
        /**
         * 删除数据SQL模板
         * 第1个{}:源表名
         * 第2个{}:统计多少天之前的数据，不包含当天
         * 第3个{}:每批次迁移数量
         */
        DELETE_SQL_TEMPLATE("delete from {} where DATE_FORMAT(date_created,'%Y-%m-%d') <= DATE_SUB(CURRENT_DATE,INTERVAL {} DAY) order by id asc limit {}");

        private final String sql;
    }

    @Getter
    @AllArgsConstructor
    enum BetweenDateEnum {
        /**
         * 统计数量SQL模板，带条件
         * 第1个{}:表名
         * 第2个{}:开始日期（包含当天）
         * 第3个{}:结束日期（包含当天）
         */
        COUNT_SQL_TEMPLATE_WITH_CONDITION("select count(*) from {} where DATE_FORMAT(date_created,'%Y-%m-%d') >= '{}' and DATE_FORMAT(date_created,'%Y-%m-%d') <= '{}'"),
        /**
         * 新增数据SQL模板
         * 第1个{}:目标表名
         * 第2个{}:源表名
         * 第3个{}:开始日期（包含当天）
         * 第4个{}:结束日期（包含当天）
         * 第5个{}:每批次迁移数量
         */
        INSERT_SQL_TEMPLATE("insert into {} select * from {} where DATE_FORMAT(date_created,'%Y-%m-%d') >= '{}' and DATE_FORMAT(date_created,'%Y-%m-%d') <= '{}' order by id asc limit {}"),
        /**
         * 删除数据SQL模板
         * 第1个{}:源表名
         * 第2个{}:开始日期（包含当天）
         * 第3个{}:结束日期（包含当天）
         * 第4个{}:每批次迁移数量
         */
        DELETE_SQL_TEMPLATE("delete from {} where DATE_FORMAT(date_created,'%Y-%m-%d') >= '{}' and DATE_FORMAT(date_created,'%Y-%m-%d') <= '{}' order by id asc limit {}");

        private final String sql;
    }

    @Getter
    @AllArgsConstructor
    enum SpecifiedDateEnum {
        /**
         * 统计数量SQL模板，带条件
         * 第1个{}:表名
         * 第2个{}:统计多少天之前的数据，不包含当天
         */
        COUNT_SQL_TEMPLATE_WITH_CONDITION("select count(*) from {} where DATE_FORMAT(date_created,'%Y-%m-%d') = '{}'"),
        /**
         * 新增数据SQL模板
         * 第1个{}:目标表名
         * 第2个{}:源表名
         * 第3个{}:指定日期
         * 第4个{}:每批次迁移数量
         */
        INSERT_SQL_TEMPLATE("insert into {} select * from {} where DATE_FORMAT(date_created,'%Y-%m-%d') = '{}' order by id asc limit {}"),
        /**
         * 删除数据SQL模板
         * 第1个{}:源表名
         * 第2个{}:指定日期
         * 第3个{}:每批次迁移数量
         */
        DELETE_SQL_TEMPLATE("delete from {} where DATE_FORMAT(date_created,'%Y-%m-%d') = '{}' order by id asc limit {}");

        private final String sql;
    }

    @Getter
    @AllArgsConstructor
    enum FixedSizeEnum {
        /**
         * 统计数量SQL模板，带条件
         * 第1个{}:表名
         * 第2个{}:迁移数据总大小
         */
        COUNT_SQL_TEMPLATE_WITH_CONDITION("select count(*) from (select id from {} order by id asc limit {}) as t"),
        /**
         * 新增数据SQL模板
         * 第1个{}:目标表名
         * 第2个{}:源表名
         * 第4个{}:每批次迁移数量
         */
        INSERT_SQL_TEMPLATE("insert into {} select * from {} order by id asc limit {}"),
        /**
         * 删除数据SQL模板
         * 第1个{}:源表名
         * 第3个{}:每批次迁移数量
         */
        DELETE_SQL_TEMPLATE("delete from {} order by id asc limit {}");

        private final String sql;
    }
}
